#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File          :    network.py    
@Contact       :    LJL959@QQ.COM
@License       :    (C)Copyright 2020-2021, Liugroup-NLPR-CASIA
@Modify Time   :    2020/12/9 10:32        
@Author        :    LiuJiaolong
@Version       :    1.0
@Description    :   病人与正常人分类网络
"""
# import lib


import torch
import torch.nn as nn
import torch.nn.functional as F


class Net(nn.Module):
    def __init__(self):                 # 构造函数，用于设定网络层
        super(Net, self).__init__()     # 标准语句
        self.conv1 = torch.nn.Conv2d(1, 16, 3)              # 第一个卷积层，输入通道数为3，输出通道数为16，卷积核大小为3*3，其余参数默认
        self.conv2 = torch.nn.Conv2d(16, 16, 3, padding=1)  # 第二个卷积层，输入通道数为16（第一层的输出通道数），输出通道数为16，卷积核3*3，padding（补0）为1

        self.fc1 = nn.Linear(16576, 128)            # 第一个全连接层，线性连接，输入结点数为：     ，输出结点数为128
        self.fc2 = nn.Linear(128, 64)               # 第二个全连接层，输入结点数为128（第一层输出结点数目），输出结点数为64
        self.fc3 = nn.Linear(64, 2)                 # 第三个全连接层，输入结点数为64（第二次输出结点数目），输出结点数为2

    def forward(self, x):               # 重写父类forward方法，通过该方法获取网络输入数据后的输出值
        x = self.conv1(x)               # 第一次卷积，1 16 114 148
        x = F.relu(x)                   # 第一次卷积的结果经过ReLU激活函数处理
        x = F.max_pool2d(x, 2)          # 第一次池化，池化大小为2*2， 方式为最大池化

        x = self.conv2(x)               # 第二次卷积，1 16 28 37
        x = F.relu(x)                   # 第二次卷积结果经过ReLU激活函数处理
        x = F.max_pool2d(x, 2)          # 第二次池化，池化大小为2*2，最大池化

        x = x.view(x.size()[0], -1)     # 由于全连接层输入的是一维张量，因此要对输入的  格式的数据排列成  的形式

        x = F.relu(self.fc1(x))         # 第一次全连接，ReLU激活
        x = F.relu(self.fc2(x))         # 第二次全连，ReLU激活
        y = self.fc3(x)                 # 第三次全连，ReLU激活

        return y

